package com.yuhuihui.common.utils;

import org.springframework.util.ClassUtils;
import org.springframework.util.NumberUtils;
import org.springframework.util.ObjectUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 数据转换工具类
 *
 * @author yuhh
 * @date 2022-08-22 16:29:00
 */
public final class ConverterUtil {

    /**
     * 分割时间的符号，时间格式为：yyyy-mm-dd
     */
    private final static String DATE_SPLIT_SIGN = "-";

    /**
     * 分割时间后字符串数组的长度
     */
    private final static int DATE_VALUE_LENGTH = 3;

    /**
     * 分割时间后年字符串的长度
     */
    private final static int YEAR_LENGTH = 4;

    /**
     * 分割时间后月或日字符串的长度
     */
    private final static int MONTH_OR_DAY_LENGTH = 2;

    /**
     * 分割时间后年字符串的的下标
     */
    private final static int YEAR_INDEX = 0;

    /**
     * 分割时间后月字符串的的下标
     */
    private final static int MONTH_INDEX = 1;

    /**
     * 分割时间后日字符串的的下标
     */
    private final static int DAY_INDEX = 2;

    /**
     * 类型转换
     *
     * @param type  需要转换的类型
     * @param value 需要转换的值
     * @return {@link Object } 转换后的值
     * @throws ParseException 异常
     * @author yuhh
     * @date 2022-08-22 16:28:45
     */
    public static Object convert(Class type, Object value) throws ParseException {

        if (type == null){
            return value;
        }

        if (ObjectUtils.isEmpty(value)){
            return value;
        }

        String valueStr = String.valueOf(value);

        if (ClassUtils.isAssignable(String.class, type)) {
            return valueStr;
        }

        if (ClassUtils.isAssignable(Number.class, type)) {
            return NumberUtils.parseNumber(valueStr, type);
        }

        if (ClassUtils.isAssignable(Boolean.class, type)) {
            return Boolean.parseBoolean(valueStr);
        }

        if (ClassUtils.isAssignable(Date.class, type)){
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(valueStr);
        }

        return value;
    }

    /**
     * 是否可以转换
     *
     * @param value 需要判断的值
     * @return boolean 是否可以转换
     * @author yuhh
     * @date 2023-05-25 14:09:29
     */
    public static boolean canConverter(String value) {
        if (ObjectUtils.isEmpty(value)){
            return false;
        }
        boolean canConverter = false;
        String[] values = value.split(DATE_SPLIT_SIGN);
        if (values.length == DATE_VALUE_LENGTH &&
                values[YEAR_INDEX].length() == YEAR_LENGTH &&
                values[MONTH_INDEX].length() == MONTH_OR_DAY_LENGTH &&
                values[DAY_INDEX].length() == MONTH_OR_DAY_LENGTH){
            canConverter = true;
        }
        return canConverter;
    }

    private ConverterUtil(){

    }
}
